package databasehandling;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import model.Ansat;
import model.Billet;
import model.BilletSalg;
import model.Event;
import model.EventSalg;
import model.EventType;
import model.Kasse;
import model.Leverandør;
import model.Salg;
import model.Vare;
import model.VareGruppe;
import model.VareSalg;

public class SalgsHandler {

    protected SalgsHandler() {
    }

    /**
     * opretter salgsobjekt
     *
     * @param salg
     * @throws SQLException
     */
    public void opretSalg(Salg salg, Ansat ansat, Kasse kasse) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy-HH:mm:ss");
        int dankort = 0;
        if (salg.isDankort()) {
            dankort = 1;
        }
        int valutaDKK = 0;
        if (salg.isValutaDKK()) {
            valutaDKK = 1;
        }
        String datoTid = sdf.format(salg.getDatoTid().getTime());
        if (ansat == null) {
            System.err.println("Ansat = null");
        }
        if (kasse == null) {
            System.err.println("Kasse = null");
        }
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `OprettelseAfSalgsobjekt` (" + salg.getTotalBeløb() + ",'" + datoTid + "'," + dankort + "," + valutaDKK + "," + salg.getRabat() + "," + ansat.getID() + "," + kasse.getId() + ")");
        if (rs.next()) {
            salg.setId(rs.getInt("ID"));
        }
    }

    /**
     * Opdaterer og gemmer salgsobjektet
     *
     * @param totalbeløb
     * @param dankort
     * @param valutaDKK
     * @param rabat
     * @param salgsID
     * @throws SQLException
     */
    public void afslutSalg(Salg salg) throws SQLException {
        int dankortBool, valutaBool;
        int totalBeløb = salg.beregnTotalBeløb();
        if (salg.isDankort()) {
            dankortBool = 1;
        }
        if (salg.isValutaDKK()) {
            valutaBool = 1;
        }
        DatabaseHandler.getInstance().execute("CALL `AfslutSalg`(" + totalBeløb + "," + salg.isDankort() + "," + salg.isValutaDKK() + "," + salg.getRabat() + "," + salg.getId() + ")");
    }

    public void tilføjEventTilSalg(EventSalg eventSalg, Salg salg) throws SQLException {
        int valutaDKK = 0;
        if (eventSalg.getValutaDKK()) {
            valutaDKK = 1;
        }
        DatabaseHandler.getInstance().execute("CALL `TilføjEventTilSalg`(" + eventSalg.getEvent().getId() + "," + salg.getId() + "," + eventSalg.getSalgspris() + "," + valutaDKK + "," + eventSalg.getRabat() + "," + eventSalg.getEvent().getAntalFremmødte() + ")");

    }

    public void tilføjVareTilSalg(VareSalg vareSalg, Salg salg) throws SQLException {
        DatabaseHandler.getInstance().execute("CALL `TilføjVareTilSalg` (" + vareSalg.getAntal() + "," + vareSalg.getVare().getVarenummer() + "," + vareSalg.getSalgspris() + "," + vareSalg.getValutaDKK() + "," + salg.getId() + ","+vareSalg.getRabat()+")");
    }

    public void tilføjBilletTilSalg(BilletSalg billetSalg, Salg salg) throws SQLException {
        DatabaseHandler.getInstance().execute("CALL `TilføjBilletTilSalg` (" + billetSalg.getAntal() + "," + billetSalg.getSalgspris() + "," + billetSalg.getValutaDKK() + "," + billetSalg.getRabat() + "," + billetSalg.getBillet().getId() + "," + salg.getId() + ")");
    }

    public Billet hentBilletVedType(String type) throws SQLException {
        Billet billet = null;
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentBillet`('" + type + "')");
        if (rs.next()) {
            billet = new Billet(rs.getInt("ID"), rs.getString("billetType"), rs.getInt("prisDKK"), rs.getInt("prisEURO"));
        }
        return billet;
    }

    public ArrayList<VareSalg> hentVarerTilknyttetSalg(Salg salg) throws SQLException {
        ArrayList<VareSalg> vareSalgsListe = new ArrayList<>();
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentVarerTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            VareSalg vareSalg = new VareSalg(rs.getInt("ID"), rs.getInt("antal"), rs.getInt("salgsPris"), rs.getInt("rabat"), new Vare(rs.getInt("VareNummer"), rs.getString("Varenavn"), rs.getInt("Indkøbspris"), rs.getInt("UdsalgsprisDK"), rs.getInt("UdsalgsprisEURO"), rs.getInt("vareRabat"), rs.getInt("Antal"), new VareGruppe(rs.getInt("vareGruppeID"), rs.getString("vareGruppeNavn")), 
                    new Leverandør(rs.getInt("leverandørID"), rs.getString("Firmanavn"), rs.getString("Kontaktperson"), rs.getString("TlfNr"), rs.getString("leverandørAdresse"))));
            vareSalgsListe.add(vareSalg);
        }
        return vareSalgsListe;
    }

    public ArrayList<BilletSalg> hentBilletTilknyttetSalg(Salg salg) throws SQLException {
        ArrayList<BilletSalg> billetSalgsListe = new ArrayList<>();
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentBilletTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            BilletSalg billetSalg = new BilletSalg(rs.getInt("ID"), rs.getInt("antal"), rs.getInt("salgsPris"),
                    rs.getBoolean("valutaDKK"), rs.getInt("rabat"), new Billet(rs.getInt("billetID"),
                            rs.getString("billetType"), rs.getInt("prisDKK"), rs.getInt("prisEURO")));
            billetSalgsListe.add(billetSalg);
        }
        return billetSalgsListe;
    }

    public ArrayList<EventSalg> hentEventsTilknyttetSalg(Salg salg) throws SQLException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy-HH:mm:ss");
        ArrayList<EventSalg> eventSalgsListe = new ArrayList<>();
        EventSalg eventSalg = null;
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentEventsTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(sdf.parse(rs.getString("datoTid")));
            eventSalg = new EventSalg(rs.getInt("ID"), rs.getInt("salgsPris"), rs.getBoolean("valutaDKK"), rs.getInt("rabat"), 
                    new Event(rs.getInt("EventID"), cal, rs.getInt("antalBestilte"), rs.getInt("antalFremmødte"), rs.getString("sted"), rs.getString("kundeTlf"), new EventType(rs.getInt("eventTypeID"), rs.getString("eventTypeNavn"), rs.getInt("prisDKK"), rs.getInt("prisEURO"))));
            eventSalgsListe.add(eventSalg);
        }
        return eventSalgsListe;
    }

}
